--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit 48f3cd50c73b693bd41220fc9365b1481bf7137c
Parents : 7ad117a
Author : Mark Qvist <mark@unsigned.io>
Date : 2021-06-30T14:49:26+02:00
Added announce info dialog and ability to start conversation from heard announces.
Changes
2 files changed, 102 insertions(+), 15 deletions(-)
Diff
diff --git a/nomadnet/ui/textui/Conversations.py b/nomadnet/ui/textui/Conversations.py
index af523e5..56a98a7 100644
--- a/nomadnet/ui/textui/Conversations.py
+++ b/nomadnet/ui/textui/Conversations.py
@@ -322,6 +322,10 @@ class ConversationsDisplay():
self.currently_displayed_conversation = source_hash
options = self.widget.options("weight", 1-ConversationsDisplay.list_width)
self.widget.contents[1] = (self.make_conversation_widget(source_hash), options)
+ if source_hash == None:
+ self.widget.set_focus_column(0)
+ else:
+ self.widget.set_focus_column(1)
def make_conversation_widget(self, source_hash):
diff --git a/nomadnet/ui/textui/Network.py b/nomadnet/ui/textui/Network.py
index 79ad293..a2ef4d4 100644
--- a/nomadnet/ui/textui/Network.py
+++ b/nomadnet/ui/textui/Network.py
@@ -9,7 +9,7 @@ class NetworkDisplayShortcuts():
def __init__(self, app):
self.app = app
- self.widget = urwid.AttrMap(urwid.Text("Network Display Shortcuts"), "shortcutbar")
+ self.widget = urwid.AttrMap(urwid.Text("[C-\u2191\u2193] Navigate announces"), "shortcutbar")
class DialogLineBox(urwid.LineBox):
@@ -44,8 +44,95 @@ class ListEntry(urwid.Text):
self._emit('click')
return True
+
+class AnnounceInfo(urwid.WidgetWrap):
+ def __init__(self, announce, parent, app):
+ self.app = nomadnet.NomadNetworkApp.get_shared_instance()
+ self.parent = self.app.ui.main_display.sub_displays.network_display
+
+ source_hash = announce[1]
+ time_format = app.time_format
+ dt = datetime.fromtimestamp(announce[0])
+ ts_string = dt.strftime(time_format)
+ trust_level = self.app.directory.trust_level(source_hash)
+ trust_str = ""
+ display_str = self.app.directory.simplest_display_str(source_hash)
+ addr_str = "<"+RNS.hexrep(source_hash, delimit=False)+">"
+ try:
+ data_str = announce[2].decode("utf-8")
+ data_style = ""
+ if trust_level != DirectoryEntry.TRUSTED and len(data_str) > 32:
+ data_str = data_str[:32]+" [...]"
+ except Exception as e:
+ data_str = "Decode failed"
+ data_style = "list_untrusted"
+
+
+ if trust_level == DirectoryEntry.UNTRUSTED:
+ trust_str = "Untrusted"
+ symbol = "\u2715"
+ style = "list_untrusted"
+ elif trust_level == DirectoryEntry.UNKNOWN:
+ trust_str = "Unknown"
+ symbol = "?"
+ style = "list_unknown"
+ elif trust_level == DirectoryEntry.TRUSTED:
+ trust_str = "Trusted"
+ symbol = "\u2713"
+ style = "list_trusted"
+ elif trust_level == DirectoryEntry.WARNING:
+ trust_str = "Warning"
+ symbol = "\u26A0"
+ style = "list_warning"
+ else:
+ trust_str = "Untrusted"
+ symbol = "\u26A0"
+ style = "list_untrusted"
+
+ def show_announce_stream(sender):
+ options = self.parent.left_pile.options(height_type="weight", height_amount=1)
+ self.parent.left_pile.contents[1] = (AnnounceStream(self.app, self.parent), options)
+
+ def converse(sender):
+ show_announce_stream(None)
+ try:
+ existing_conversations = nomadnet.Conversation.conversation_list(self.app)
+
+ source_hash_text = RNS.hexrep(source_hash, delimit=False)
+ display_name = data_str
+
+ if not source_hash_text in [c[0] for c in existing_conversations]:
+ entry = DirectoryEntry(source_hash, display_name, trust_level)
+ self.app.directory.remember(entry)
+
+ new_conversation = nomadnet.Conversation(source_hash_text, nomadnet.NomadNetworkApp.get_shared_instance(), initiator=True)
+ self.app.ui.main_display.sub_displays.conversations_display.update_conversation_list()
+
+ self.app.ui.main_display.sub_displays.conversations_display.display_conversation(None, source_hash_text)
+ self.app.ui.main_display.show_conversations(None)
+
+ except Exception as e:
+ RNS.log("Error while starting conversation from announce. The contained exception was: "+str(e), RNS.LOG_ERROR)
+
+ pile = urwid.Pile([
+ urwid.Text("Addr : "+addr_str, align="left"),
+ urwid.Text("Name : "+display_str, align="left"),
+ urwid.Text(["Trust : ", (style, trust_str)], align="left"),
+ urwid.Divider("\u2504"),
+ urwid.Text(["Announce Data: \n", (data_style, data_str)], align="left"),
+ urwid.Divider("\u2504"),
+ urwid.Columns([("weight", 0.45, urwid.Button("Back", on_press=show_announce_stream)), ("weight", 0.1, urwid.Text("")), ("weight", 0.45, urwid.Button("Converse", on_press=converse))])
+ ])
+
+ self.display_widget = urwid.Filler(pile, valign="top", height="pack")
+
+ urwid.WidgetWrap.__init__(self, urwid.LineBox(self.display_widget, title="Announce Info"))
+
+
class AnnounceStreamEntry(urwid.WidgetWrap):
- def __init__(self, app, timestamp, source_hash):
+ def __init__(self, app, announce):
+ timestamp = announce[0]
+ source_hash = announce[1]
self.app = app
self.timestamp = timestamp
time_format = app.time_format
@@ -77,10 +164,17 @@ class AnnounceStreamEntry(urwid.WidgetWrap):
focus_style = "list_focus_untrusted"
widget = ListEntry(ts_string+" "+display_str)
+ urwid.connect_signal(widget, "click", self.display_announce, announce)
self.display_widget = urwid.AttrMap(widget, style, focus_style)
urwid.WidgetWrap.__init__(self, self.display_widget)
+ def display_announce(self, event, announce):
+ parent = self.app.ui.main_display.sub_displays.network_display
+ info_widget = AnnounceInfo(announce, parent, self.app)
+ options = parent.left_pile.options(height_type="weight", height_amount=1)
+ parent.left_pile.contents[1] = (info_widget, options)
+
class AnnounceStream(urwid.WidgetWrap):
def __init__(self, app, parent):
self.app = app
@@ -93,7 +187,7 @@ class AnnounceStream(urwid.WidgetWrap):
self.widget_list = []
self.update_widget_list()
- wlt = [AnnounceStreamEntry(self.app, e[0], e[1]) for e in self.app.directory.announce_stream]
+ wlt = [AnnounceStreamEntry(self.app, e) for e in self.app.directory.announce_stream]
self.ilb = IndicativeListBox(
self.widget_list,
#wlt,
@@ -118,7 +212,7 @@ class AnnounceStream(urwid.WidgetWrap):
self.added_entries.insert(0, e[0])
new_entries.insert(0, e)
- new_widgets = [AnnounceStreamEntry(self.app, e[0], e[1]) for e in new_entries]
+ new_widgets = [AnnounceStreamEntry(self.app, e) for e in new_entries]
for nw in new_widgets:
self.widget_list.insert(0, nw)
@@ -356,17 +450,6 @@ class NodeSettings(urwid.WidgetWrap):
urwid.WidgetWrap.__init__(self, urwid.AttrMap(urwid.LineBox(self.display_widget, title="Node Settings"), widget_style))
- def node_list_selection(self, arg1, arg2):
- pass
-
- def make_node_widgets(self):
- widget_list = []
- for node_entry in self.node_list:
- # TODO: Implement this
- widget_list.append(ListEntry("Node "+RNS.prettyhexrep(node_entry.source_hash)))
-
- # TODO: Sort list
- return widget_list
class UpdatingText(urwid.WidgetWrap):
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────